home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2007 December / PCWKCD1207B.iso / Blogowanie poza sfera / Flock 1.0 beta / flock-1.0RC3.en-US.win32.exe / flock / components / flockBlogWebServiceMetaweblog.js < prev    next >
Text File  |  2007-10-18  |  17KB  |  482 lines

  1. // BEGIN FLOCK GPL
  2. // 
  3. // Copyright Flock Inc. 2005-2007
  4. // http://flock.com
  5. // 
  6. // This file may be used under the terms of of the
  7. // GNU General Public License Version 2 or later (the "GPL"),
  8. // http://www.gnu.org/licenses/gpl.html
  9. // 
  10. // Software distributed under the License is distributed on an "AS IS" basis,
  11. // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  12. // for the specific language governing rights and limitations under the
  13. // License.
  14. // 
  15. // END FLOCK GPL
  16.  
  17. const Cc = Components.classes;
  18. const Ci = Components.interfaces;
  19.  
  20. const FLOCK_MW_CID =  Components.ID('{143c7ec8-6ae9-473a-9289-e19321bfa72e}');
  21. const FLOCK_MW_CONTRACTID = '@flock.com/blog/service/metaweblog;1';
  22. const FLOCK_MW_DESCRIPTION = 'MetaWeblog';
  23.  
  24. const FLOCK_BLOG_RDF_SETTINGS     = 'urn:flock:blog:settings';
  25.  
  26. function loadLibraryFromSpec(aSpec) {
  27.   var loader = Components.classes['@mozilla.org/moz/jssubscript-loader;1']
  28.     .getService(Components.interfaces.mozIJSSubScriptLoader);
  29.  
  30.   loader.loadSubScript(aSpec);
  31. }
  32.  
  33. loadLibraryFromSpec("chrome://flock/content/blog/technoratiTags.js");
  34. loadLibraryFromSpec("chrome://flock/content/blog/blogBackendLib.js");
  35. loadLibraryFromSpec("chrome://flock/content/xmlrpc/xmlrpchelper.js");
  36.  
  37. // CONSTRUCTOR
  38. function metaweblogWebService () {
  39.   //this.mQueue = null;
  40.  
  41.   // set attributes
  42.   this.name = 'MetaWeblog';
  43.   this.shortName = 'metaweblog';
  44.   this.description = "The MetaWeblog API"
  45.   this.supportsCategories = 2;
  46.   this.supportsPostReplace = true;
  47.   this.appKey = "";
  48.  
  49.   // Logger
  50.   this.logger = Components.classes['@flock.com/logger;1']
  51.     .createInstance(Components.interfaces.flockILogger);
  52.   this.logger.init("blog");
  53. }
  54.  
  55. // the nsISupports implementation
  56. metaweblogWebService.prototype.QueryInterface = function (iid) {
  57.   if (iid.equals(Ci.flockICustomBlogWebService) ||
  58.       iid.equals(Ci.flockIBlogWebService) || 
  59.       iid.equals(Ci.flockIWebService) || 
  60.       iid.equals(Ci.nsIClassInfo) || 
  61.       iid.equals(Ci.nsISupports)) {
  62.     return this;
  63.   }
  64.  
  65.   throw Components.results.NS_ERROR_NO_INTERFACE;
  66. }
  67.  
  68.  
  69. // Listeners
  70. function blogListener(aListener, aBool){
  71.   this.listener = aListener;
  72.   this.container = aBool;
  73.   this.logger = Components.classes['@flock.com/logger;1']
  74.     .createInstance(Components.interfaces.flockILogger);
  75.   this.logger.init("blog");
  76. }
  77.  
  78. blogListener.prototype = 
  79. {
  80.   // aResult is an Array of struct objects
  81.   onResult: function(aResult) {
  82.     this.logger.info("<<<<<<<<<< MetaWeblog API: SERVER TO FLOCK\n");
  83.     for (i=0; i<aResult.length; i++){
  84.       this.logger.debug("Entry\n");
  85.       var entry = aResult[i];
  86.       for (j in entry)
  87.         this.logger.debug("  -> "+j+": "+entry[j]+"\n");
  88.     }
  89.     // Create an in-memory datasource
  90.     var rdfService = Components.classes["@mozilla.org/rdf/rdf-service;1"]
  91.       .getService(Components.interfaces.nsIRDFService);
  92.     var rdf = Components.classes["@mozilla.org/rdf/datasource;1?name=in-memory-datasource"].createInstance(Components.interfaces.nsIRDFDataSource);
  93.     var rdfContainerUtils = Components.classes["@mozilla.org/rdf/container-utils;1"]
  94.       .getService(Components.interfaces.nsIRDFContainerUtils);
  95.     // Fill it with the results
  96.     if (this.container)
  97.       var container = rdfContainerUtils.MakeSeq(rdf, rdfService.GetResource("urn:flock:blog:elements"));
  98.     for (i=0; i<aResult.length; i++){
  99.       var id='obj_' + Math.round(10000*Math.random())
  100.       var subject = rdfService.GetResource("http://www.flock.com/rdf/"+id);
  101.       var entry = aResult[i];
  102.       for (j in entry){
  103.         var predicate = rdfService.GetResource("http://www.flock.com/rdf/"+j);
  104.         var name = rdfService.GetLiteral(entry[j]);
  105.         
  106.         rdf.Assert(subject, predicate, name, true);
  107.       }
  108.       if (this.container)
  109.         container.AppendElement(subject);
  110.     }
  111.  
  112.     // and return the data source through the listener
  113.     this.listener.onResult(rdf);
  114.   },
  115.   onError: function(error) {
  116.     this.logger.error("<<<<<<<<<< MetaWeblog API: SERVER TO FLOCK\n");
  117.     this.logger.error("ERROR "+error+"\n");
  118.     this.listener.onError(error);
  119.   }, 
  120.   onFault: function(error) {
  121.     this.logger.error("<<<<<<<<<< MetaWeblog API: SERVER TO FLOCK\n");
  122.     this.logger.error("FAULT "+error+"\n");
  123.     this.listener.onFault(error);
  124.   } 
  125. }
  126.  
  127. function blogCategoryListener(aListener, aBool){
  128.   this.listener = aListener;
  129.   this.container = aBool;
  130.   this.logger = Cc['@flock.com/logger;1']
  131.     .createInstance(Ci.flockILogger);
  132.   this.logger.init("blog");
  133. }
  134.  
  135. blogCategoryListener.prototype = 
  136. {
  137.   onResult: function(aResult) {
  138.     this.logger.info("<<<<<<<<<< Metaweblog API: SERVER TO FLOCK\n");
  139.     var result = new Array();
  140.     for (i=0; i<aResult.length; i++){
  141.       this.logger.debug("Entry\n");
  142.       var entry = aResult[i];
  143.       for (j in entry)
  144.         this.logger.debug("  -> "+j+": "+entry[j]+"\n");
  145.     }
  146.     for (i=0; i<aResult.length; i++){
  147.       this.logger.debug("Found the category "+aResult[i].description+"\n");
  148.       var category = new BlogCategory(i, aResult[i].description);
  149.       result.push(category);
  150.     }
  151.  
  152.     // and return the data source through the listener
  153.     this.listener.onResult(new simpleEnumerator(result));
  154.   },
  155.   onError: function(errorcode, errormsg) {
  156.     this.logger.error("<<<<<<<<<< Metaweblog API: SERVER TO FLOCK\n");
  157.     this.logger.error("ERROR "+errorcode+" "+errormsg+"\n");
  158.     var error = Cc['@flock.com/error;1'].createInstance(Ci.flockIError);
  159.     error.serviceErrorCode = errorcode;
  160.     error.serviceErrorString = errormsg;
  161.     this.listener.onError(error);
  162.   }, 
  163.   onFault: function(errorcode, errormsg) {
  164.     this.logger.error("<<<<<<<<<< Metaweblog API: SERVER TO FLOCK\n");
  165.     this.logger.error("FAULT "+errorcode+" "+errormsg+"\n");
  166.     var error = Cc['@flock.com/error;1'].createInstance(Ci.flockIError);
  167.     error.serviceErrorCode = errorcode;
  168.     error.serviceErrorString = errormsg;
  169.     this.listener.onFault(error);
  170.   } 
  171. }
  172.  
  173. metaweblogWebService.prototype.detectAccount = function (aUrl, aLinkList){
  174.   return null;
  175. }
  176.  
  177.  
  178. metaweblogWebService.prototype.newPost = function(aListener, aBlogId, aPost, aPublish, aNotifications){
  179.   var gBlogService = Cc['@flock.com/flock-blog;1'].getService(Ci.flockIBlogService);
  180.   var account = gBlogService.getAccount(aBlogId);
  181.  
  182.   var svc = this;
  183.  
  184.   var notifsArray = [];
  185.   var catArray = [];
  186.   var html = aPost.description + addTechnoratiTags(aPost.tags);
  187.   while (aPost.categories.hasMoreElements()) {
  188.     var category = aPost.categories.getNext();
  189.     category.QueryInterface(Ci.flockIBlogCategory);
  190.     catArray.push(category.label);
  191.   }
  192.  
  193.   var listener = {
  194.     onResult: function(aResult) {
  195.       aListener.onResult(aResult);
  196.     },
  197.     onError: function(error) {
  198.       svc.logger.error("<<<<<<<<<< MetaWeblog API: SERVER TO FLOCK\n");
  199.       svc.logger.error("ERROR "+error+"\n");
  200.       aListener.onError(error);
  201.     }, 
  202.     onFault: function(error) {
  203.       svc.logger.error("<<<<<<<<<< MetaWeblog API: SERVER TO FLOCK\n");
  204.       svc.logger.error("FAULT "+error+"\n");
  205.       aListener.onFault(error);
  206.     } 
  207.   };
  208.  
  209.   var xmlrpcServer = new flockXmlRpcServer (account.apiLink);
  210.   var args = [account.blogid, account.username, account.password, 
  211.               {title: aPost.title, description: html, categories: catArray,
  212.                mt_convert_breaks: "", mt_tb_ping_urls: notifsArray}, aPublish];
  213.   xmlrpcServer.call("metaWeblog.newPost", args, listener);
  214. }
  215.  
  216. metaweblogWebService.prototype.editPost = function(aListener, aBlogId, aPost, aPublish, aNotifications){
  217.   var gBlogService = Cc['@flock.com/flock-blog;1'].getService(Ci.flockIBlogService);
  218.   var account = gBlogService.getAccount(aBlogId);
  219.   var catArray = [];
  220.  
  221.   var svc = this;
  222.   var listener = {
  223.     onResult: function(aResult) {
  224.       aListener.onResult(aResult);
  225.     },
  226.     onError: function(error) {
  227.       svc.logger.error("<<<<<<<<<< MetaWeblog API: SERVER TO FLOCK\n");
  228.       svc.logger.error("ERROR "+error+"\n");
  229.       aListener.onError(error);
  230.     }, 
  231.     onFault: function(error) {
  232.       svc.logger.error("<<<<<<<<<< MetaWeblog API: SERVER TO FLOCK\n");
  233.       svc.logger.error("FAULT "+error+"\n");
  234.       aListener.onFault(error);
  235.     } 
  236.   };
  237.  
  238.   var notifsArray = new Array();
  239.   var html = aPost.description + addTechnoratiTags(aPost.tags);
  240.   while (aPost.categories.hasMoreElements()) {
  241.     var category = aPost.categories.getNext();
  242.     category.QueryInterface(Ci.flockIBlogCategory);
  243.     catArray.push(category.label);
  244.   }
  245.  
  246.   var xmlrpcServer = new flockXmlRpcServer (account.apiLink);
  247.   var args = [aPost.postid, account.username, account.password, 
  248.               {title: aPost.title, description: html, categories: catArray,
  249.                dateCreated: new Date(parseInt(aPost.issued))}, aPublish];
  250.   xmlrpcServer.call("metaWeblog.editPost", args, listener);
  251. }
  252.  
  253. metaweblogWebService.prototype.deletePost = function(aListener, aAccount, aPostid){
  254.   dump("***** metaweblogWebService.deletePost: not supported!\n");
  255. }
  256.  
  257. metaweblogWebService.prototype.getPost = function(aListener, aAccount, aPostid){
  258.   var listener = new blogListener(aListener, false);
  259.   var xmlrpcServer = new flockXmlRpcServer (aAccount.apiLink);
  260.   var args = [aPostid, aAccount.username, aAccount.password];
  261.   xmlrpcServer.call("metaWeblog.getPost", args, listener);
  262. }
  263.  
  264. metaweblogWebService.prototype.getUsersBlogs = function(aListener, aAccount){
  265.   var svc = this;
  266.   var listener = {
  267.     // aResult is an Array of struct objects
  268.     onResult: function(aResult) {
  269.       var result = new Array();
  270.       for (i=0; i<aResult.length; i++){
  271.         var entry = aResult[i];
  272.         var newAccount = new BlogAccount(entry.blogName);
  273.         newAccount.blogid = entry.blogid;
  274.         newAccount.apiLink = "";
  275.         newAccount.URL = entry.url;
  276.         result.push(newAccount);
  277.       }
  278.       aListener.onSuccess(new simpleEnumerator(result), null);
  279.     },
  280.     onError: function(errorcode, errormsg) {
  281.       svc.logger.error("<<<<<<<<<< Metaweblog API: SERVER TO FLOCK\n");
  282.       svc.logger.error("ERROR "+errorcode+" "+errormsg+"\n");
  283.       var error = Cc['@flock.com/error;1'].createInstance(Ci.flockIError);
  284.       error.serviceErrorCode = errorcode;
  285.       error.serviceErrorString = errormsg;
  286.       aListener.onError(null, "", error);
  287.     }, 
  288.     onFault: function(errorcode, errormsg) {
  289.       svc.logger.error("<<<<<<<<<< Metaweblog API: SERVER TO FLOCK\n");
  290.       svc.logger.error("FAULT "+errorcode+" "+errormsg+"\n");
  291.       var error = Cc['@flock.com/error;1'].createInstance(Ci.flockIError);
  292.       error.serviceErrorCode = errorcode;
  293.       error.serviceErrorString = errormsg;
  294.       switch (errorcode) {
  295.         case 403: // Invalid login/pass
  296.         case 801: // At least dotclear uses code 801 for bad auth
  297.           error.errorCode = Ci.flockIError.BLOG_INVALID_AUTH;
  298.           error.errorString = "Bad authentication";
  299.           break;
  300.         default: // Unknown error code
  301.           error.errorCode = Ci.flockIError.BLOG_UNKNOWN;
  302.           error.errorString = "Unknown Error";
  303.       }
  304.       aListener.onError(null, "", error);
  305.     } 
  306.   }
  307.   
  308.   var xmlrpcServer = new flockXmlRpcServer (aAccount.apiLink);
  309.   var args = [this.appKey, aAccount.username, aAccount.password];
  310.   xmlrpcServer.call("blogger.getUsersBlogs", args, listener);
  311. }
  312.  
  313. metaweblogWebService.prototype.getRecentPosts = function(aListener, aBlogId, aNumber){
  314.   var gBlogService = Cc['@flock.com/flock-blog;1'].getService(Ci.flockIBlogService);
  315.   var account = gBlogService.getAccount(aBlogId);
  316.  
  317.   var listener = {
  318.     onResult: function(aResult) {
  319.       var result = new Array();
  320.       // svc.logger.info("<<<<<<<<<< MetaWeblog API: SERVER TO FLOCK\n");
  321.       for (i=0; i<aResult.length; i++) {
  322.         var post = new BlogPost();
  323.         post.title = aResult[i].title;
  324.         post.issued = aResult[i].dateCreated.getTime();
  325.         post.postid = aResult[i].postid;
  326.         result.push(post);
  327.       }
  328.  
  329.       // and return the data source through the listener
  330.       aListener.onResult(new simpleEnumerator(result));
  331.     },
  332.     onError: function(error) {
  333.       //svc.logger.error("<<<<<<<<<< MetaWeblog API: SERVER TO FLOCK\n");
  334.       //svc.logger.error("ERROR "+error+"\n");
  335.       aListener.onError(error);
  336.     }, 
  337.     onFault: function(error) {
  338.       //svc.logger.error("<<<<<<<<<< MetaWeblog API: SERVER TO FLOCK\n");
  339.       //svc.logger.error("FAULT "+error+"\n");
  340.       aListener.onFault(error);
  341.     } 
  342.   }
  343.  
  344.   var xmlrpcServer = new flockXmlRpcServer (account.apiLink);
  345.   var args = [account.blogid, account.username, account.password, aNumber];
  346.   xmlrpcServer.call("metaWeblog.getRecentPosts", args, listener);
  347. }
  348.  
  349. metaweblogWebService.prototype.getCategoryList = function(aListener, aBlogId){
  350.   var gBlogService = Cc['@flock.com/flock-blog;1'].getService(Ci.flockIBlogService);
  351.   var account = gBlogService.getAccount(aBlogId);
  352.  
  353.   var svc = this;
  354.   var listener = new blogCategoryListener(aListener, false);
  355.   var xmlrpcServer = new flockXmlRpcServer (account.apiLink);
  356.   var args = [account.blogid, account.username, account.password];
  357.   xmlrpcServer.call("metaWeblog.getCategories", args, listener);
  358. }
  359.  
  360.  
  361. metaweblogWebService.prototype.removeAccount = function (aId) {
  362.   if (!this.logger)
  363.     this.setup();
  364.  
  365.   var faves_coop = Cc["@flock.com/singleton;1"]
  366.                    .getService(Ci.flockISingleton)
  367.                    .getSingleton("chrome://flock/content/common/load-faves-coop.js")
  368.                    .wrappedJSObject;
  369.   var acUtils = Cc["@flock.com/account-utils;1"].getService(Ci.flockIAccountUtils);
  370.   var pm = Cc["@mozilla.org/passwordmanager;1"].getService(Ci.nsIPasswordManager);
  371.  
  372.   var account = faves_coop.get(aId);
  373.   
  374.   this.logger.debug("REMOVE: "+aId+" - "+account.accountId);
  375.  
  376.   // Remove the password
  377.   try {
  378.     pm.removeUser(aId, account.accountId);
  379.   }
  380.   catch(e) {
  381.     this.logger.warn("Exception trying to remove the password. It may have been already deleted.");
  382.   }
  383.  
  384.   // Destroy the blogs and the account
  385.   var _enum = account.children.enumerate();
  386.   while (_enum.hasMoreElements()) {
  387.     var blog = _enum.getNext();
  388.     account.children.remove(blog);
  389.     blog.destroy();
  390.   }
  391.   
  392.   account.destroy();
  393. }
  394.  
  395. // That a bit hacky, a way to not break flockAccountUtils.removeAllAccounts
  396. metaweblogWebService.prototype.getAccount = function (aId) {
  397.   return {
  398.     logout: function(aArg) { return; },
  399.     getInterfaces: function (count) {
  400.       var interfaceList = [Ci.nsISupports, Ci.flockIWebServiceAccount, Ci.flockIBlogWebServiceAccount];
  401.       count.value = interfaceList.length;
  402.       return interfaceList;
  403.     },
  404.     QueryInterface: function (iid) {
  405.       if (!iid.equals(Ci.nsISupports) &&
  406.         !iid.equals(Ci.flockIWebServiceAccount) &&
  407.         !iid.equals(Ci.flockIBlogWebServiceAccount)) {
  408.         throw Components.results.NS_ERROR_NO_INTERFACE;
  409.       }
  410.       return this;
  411.     }
  412.   }
  413. }
  414.  
  415.  
  416. metaweblogWebService.prototype.flags = Ci.nsIClassInfo.SINGLETON;
  417. metaweblogWebService.prototype.contractID = FLOCK_MW_CONTRACTID;
  418. metaweblogWebService.prototype.classDescription = "Flock Metaweblog API Service";
  419. metaweblogWebService.prototype.getInterfaces = function (count) {
  420.   var interfaceList = [Ci.flockIWebService,
  421.     Ci.flockICustomBlogWebService,
  422.     Ci.flockIBlogWebService,
  423.       Ci.nsIClassInfo,
  424.       Ci.nsISupports];
  425.   count.value = interfaceList.length;
  426.   return interfaceList;
  427. }
  428. metaweblogWebService.prototype.getHelperForLanguage = function (count) {return null;}
  429.  
  430. // Module implementation
  431. var MetaweblogModule = new Object();
  432.  
  433. MetaweblogModule.registerSelf =
  434. function (compMgr, fileSpec, location, type)
  435. {
  436.   compMgr = compMgr.QueryInterface(Components.interfaces.nsIComponentRegistrar);
  437.  
  438.   compMgr.registerFactoryLocation(FLOCK_MW_CID, 
  439.                   "Flock MetaWeblog JS Component",
  440.                   FLOCK_MW_CONTRACTID, 
  441.                   fileSpec, 
  442.                   location,
  443.                   type);
  444.   //necessary category registration
  445.   var catmgr = Components.classes["@mozilla.org/categorymanager;1"]
  446.     .getService (Components.interfaces.nsICategoryManager);
  447.   catmgr.addCategoryEntry('flockICustomBlogWebService', 'metaweblog', FLOCK_MW_CONTRACTID, true, true);
  448. }
  449.  
  450. MetaweblogModule.getClassObject =
  451. function (compMgr, cid, iid) {
  452.   if (!cid.equals(FLOCK_MW_CID))
  453.     throw Components.results.NS_ERROR_NO_INTERFACE;
  454.   
  455.   if (!iid.equals(Components.interfaces.nsIFactory))
  456.     throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
  457.   
  458.   return MetaweblogServiceFactory;
  459. }
  460.  
  461. MetaweblogModule.canUnload =
  462. function(compMgr)
  463. {
  464.   return true;
  465. }
  466.   
  467. // factory object
  468. var MetaweblogServiceFactory = new Object();
  469.  
  470. MetaweblogServiceFactory.createInstance =
  471. function (outer, iid) {
  472.   if (outer != null)
  473.     throw Components.results.NS_ERROR_NO_AGGREGATION;
  474.  
  475.   return (new metaweblogWebService()).QueryInterface(iid);
  476. }
  477.  
  478. /* entrypoint */
  479. function NSGetModule(compMgr, fileSpec) {
  480.   return MetaweblogModule;
  481. }
  482.